package Session;


import Levels.Level;
import Levels.LevelGenerator;
import Levels.LevelWrapper;
import Questions.Question;
import Source.QuestionsWrapper;

/**
 * Created with IntelliJ IDEA.
 * Authorization.User: Инесса
 * Date: 25.10.13
 * Time: 1:03
 * To change this template use File | Settings | File Templates.
 */

/**
 * Этот класс выполняет функции истории для пользователя. Хранит вопросы, ответы и номер текущего вопроса.
 */
public class TestSession {

    private QuestionsWrapper sessionQuestions;
    private String[] arrayAnswers;
    private int currentIndexOfLevel;
    private LevelWrapper levelWrapper;
    private LevelGenerator levelGenerator;
    private Level currentLevel;
    public static final int COUNT_OF_LEVELS=3;
    private int sessionPoints;
    private boolean isEnd=false;

    /**
     * Конструктор для создания сессии принимает массив всех вопросов и создает сессию.
     * @param questions пачка вопросов
     */
    public TestSession(QuestionsWrapper questions) {
        this.sessionQuestions = questions;
        this.levelGenerator = new LevelGenerator();
        this.levelWrapper = levelGenerator.getLevel(Level.ONE);
        this.arrayAnswers = new String[levelWrapper.getLevelSize()];
        this.currentLevel=Level.ONE;
        this.sessionPoints=0;
    }

    public TestSession(QuestionsWrapper questions,LevelWrapper levelWrapper, int pausedLevel, int savedPoints, String[] savedAnswers){
        this.sessionQuestions = questions;
        this.arrayAnswers = savedAnswers;
        this.levelGenerator = new LevelGenerator();
        this.levelWrapper=levelWrapper;
        this.currentLevel=findPausedLevel(pausedLevel);
        this.sessionPoints = savedPoints;
        this.currentIndexOfLevel = findPosition(savedAnswers);
    }

    private Level findPausedLevel(int paused){
       Level level=Level.ONE;
        for(Level pausedLevel:Level.values()){
                if(pausedLevel.getSectionEnd()==paused)
                   level=pausedLevel;
           }
        return level;

    }

    /**
     * Проверка на наличиие следующего елемента в массиве вопросов.
     * @return пройден ли уровень?
     */
    public boolean hasNextInLevel() {
        return (currentIndexOfLevel < levelWrapper.getLevelSize());
    }

    /**
     * Переход к следующему номеру вопроса
     */
    public void nextQuestion() {
        if(hasNextInLevel())
        currentIndexOfLevel++;
    }

    /**
     * Предыдущий номер вопроса
     */
    public void previousQuestion() {
        if(!(currentIndexOfLevel==0)){
           currentIndexOfLevel--;
        }
    }

    /**
     *
     * @return текущий вопрос
     */
    public Question getQuestion() {
        return sessionQuestions.getQuestionById(levelWrapper.getQuestionIndex(currentIndexOfLevel));
    }

    /**
     * Записиваем ответ пользователя в массив ответов
     * @param answer ответ пользователя
     */
    public void setAnswer(String answer) {
        arrayAnswers[currentIndexOfLevel] = answer;
    }

    /**
     * Подсчет правильных ответов для сессии
     * @return результат уровня
     */
    public int countCorrect() {
        int rightAnswer = 0;
        for (int i = 0; i < levelWrapper.getLevelSize(); i++) {
            if (sessionQuestions.getQuestionById(levelWrapper.getQuestionIndex(i)).isCorrect(arrayAnswers[i])) {
                rightAnswer++;
            }

        }
        return rightAnswer;
    }

    /**
     * Возвращает количество вопросов сессии
     * @return сколько задали всего вопросов
     */
    public int totalQuestions() {
        return levelWrapper.getLevelSize()*COUNT_OF_LEVELS;
    }

    public void flushAnswers(){
        for(int i = 0;i<arrayAnswers.length;i++){
            arrayAnswers[i]=null;
        }
    }

    /**
     * Возвращает ответы для хранения сессии
     * @return   StringArray
     */
    String[] getAnswers() {
        return arrayAnswers;
    }

    public void levelUp() {
      Level[] levels = Level.values();
      if(currentLevel.equals(levels[levels.length-1])){
          isEnd=true;
      } else {
          int position=0;
          for(int i=0;i<levels.length;i++){
              if(currentLevel.equals(levels[i])){
                  position=i+1;
              }
          }
          currentLevel=levels[position];
          this.levelWrapper=levelGenerator.getLevel(currentLevel);
          this.currentIndexOfLevel=0;
      }

    }

    public void refreshLevel() {
        levelWrapper=levelGenerator.getLevel(currentLevel);
        currentIndexOfLevel=0;
    }

    public boolean isEnd() {
        return isEnd;
    }

    public void addSessionPoints(int sessionPoints) {
        this.sessionPoints += sessionPoints;
    }

    public int getSessionPoints() {
        return sessionPoints;
    }

    public LevelWrapper getLevelWrapper() {
        return levelWrapper;
    }

    public int getCurrentLevelForSave() {
        return currentLevel.getSectionEnd();
    }

    public int getCurrentIndexOfLevel() {
        return currentIndexOfLevel;
    }

    private int findPosition(String[] answersFromFile){
        int findedPosition=0;
        for (int position=0;position<answersFromFile.length;position++){
            if(answersFromFile[position].equals("null"))
            {findedPosition=position;}
        }
        return findedPosition;
    }
}
